constraints and concepts

https://cppreference.com/w/cpp/language/constraints.html

限制可以更好的帮助模板类、模板函数、模板化函数选择更合适的模板特化、重载。

Concept

命名的一组需求(requiremetns)称为概念(concepts)。概念是一个编译期谓词,用于可以精细而简洁地限定模板的适用范围。其作为限制(Constraint)作用于模板参数类型上时,最终会成为所作用的模板的接口的一部分。

template <template_parameter_list>
concept concept_name attr = constraint_expression;

concept 无法递归定义,其本身无法被限制,无法实例化

concept 的使用:

概念是一种语义范畴而不是语法约束

Require Clauses

require clauses 是除了 concept 之外第二种引入限制的方式

Constraint

constraint-expression 是求值为 bool 的常量表达式,包括但不限于

constraint-expression 是 concept 和 require-clauses 的重要组成部分。

引入限制的方式包括:concept,require clauses。

constraint 可以用于修饰模板声明,一个声明被修饰的所有限制按 logic AND 以如下顺序依次确定(对应四种 constraint 被引入的方式),经过约束规范化形成原子约束等,然后被检查。

实例化之前的称为约束表达式;经过约束规范化之后的(即实例化之后的) constraint 分为四种

重声明需要保证两次声明中限制出现的位置和顺序相同(syntatically identical instead of logically identical),否则是非法的,no diagnostics required。

限制的包含关系:

约束的包含关系定义了约束的应用偏序

违反限制会在模板实例化之前造成”违反限制“的编译错误,而不是在模板被错误使用时才造成对应错误使用方式的编译错误。